// 元类
class Example {
    static void main(String[] args){
        Student st = new Student();
        println st.getName()
        st.metaClass.setAttribute(st, 'name', 'lee')
        println st.getName()

        st.addMarks()
    }
}

class Student{
    private String name = "Jackie";

    public String getName(){
        return this.name;
    }

    def invokeMethod(String name, Object args){
        println "method $name($args) called"
    }

    // 同时存在invokeMethod和methodMissing时优先调用methodMising
    def methodMissing(String name, def args){
        println "Missing method $name($args)"
    }
}

/*
Groovy支持methodMissing的概念。
此方法与invokeMethod的不同之处在于，
它仅在失败的方法分派的情况下被调用，
当没有找到给定名称和/或给定参数的方法时。
以下示例显示如何使用methodMissing。
*/